package com.jiangxjsy.gateway.client;

import com.jiangxjsy.core.constant.BasicConstant;
import com.jiangxjsy.core.wrap.Result;
import com.jiangxjsy.core.wrap.ResultBuilder;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * wukong-crm-master
 * 蒋胜宇
 * 2025/5/29 17:13
 *
 * <p>
 * 权限校验 Open-Feign 客户端
 * </p>
 *
 * <p>
 * 默认使用 FeignClient 实现，如果服务不可用，则使用 fallback 实现，
 * 即开启熔断器，快速失败，返回 ResultCode.SystemResultCode.SYSTEM_NO_AUTH
 * - 提示 -
 * 该客户端强制依赖 configuration.FeignConfiguration 配置类，
 * 如果没有该配置类，会导致无法正常远程访问现有的 authorization 服务
 * </p>
 */

@FeignClient(name = "authorization", fallback = AuthorizationClient.AuthorizationClientFallback.class)
public interface AuthorizationClient {
    /**
     * 权限校验
     *
     * @param authentication 用户权限标识
     * @param url 请求地址
     * @param method 请求方法
     * @return Result
     */
    @RequestMapping(value = "/permission")
    Result<?> hasPermission(
            @RequestHeader(BasicConstant.TOKEN_NAME) String authentication,
            @RequestParam("url") String url,
            @RequestParam("method") String method
    );


    @Component
    class AuthorizationClientFallback implements AuthorizationClient {
        /**
         * 权限校验
         *
         * @param authentication 用户权限标识
         * @param url 请求地址
         * @param method 请求方法
         * @return Result
         */
        @Override
        public Result<?> hasPermission(String authentication, String url, String method) {
            return ResultBuilder.noAuth();
        }
    }
}
